#ifndef COMMUNICATIONMANAGER_H
#define COMMUNICATIONMANAGER_H

#include <QObject>
#include <QMap>
#include <QPluginLoader>
#include "CommunicationInterface.h"

class CommunicationManager : public QObject {
    Q_OBJECT
public:
    static CommunicationManager &instance();

    /**
     * @brief 加载指定目录下的通信插件
     * @param pluginsDir 插件目录路径（如"../Plugins/Communication"）
     */
    void loadPlugins(const QString &pluginsDir);

    /**
     * @brief 注册通信模块实例到管理器
     * @param comm 实现了CommunicationInterface的通信模块实例
     */
    void registerCommunication(CommunicationInterface *comm);

    /**
     * @brief 获取所有已注册的通信模块
     * @return 包含所有通信模块实例的列表
     */
    QList<CommunicationInterface *> allCommunications() const;

    /**
     * @brief 根据类型筛选通信模块
     * @param type 通信类型（如"SerialPort"/"Network"）
     * @return 匹配类型的通信模块列表（可能为空）
     */
    QList<CommunicationInterface *> getCommunicationsByType(const QString &type) const;

    /**
     * @brief 向指定类型的所有通信模块发送数据
     * @param type 目标通信类型（如"SerialPort"）
     * @param data 待发送的字节数据
     * @return 至少一个模块发送成功返回true，否则返回false
     */
    bool sendDataToType(const QString &type, const QByteArray &data);

private:
    explicit CommunicationManager(QObject *parent = nullptr);
    ~CommunicationManager() override;

    QMap<QString, QList<CommunicationInterface *>> m_commMap;
 // 键：通信类型，值：对应类型的模块列表
    QList<QPluginLoader *> m_pluginLoaders;
 // 保持插件加载器引用防止被释放

    Q_DISABLE_COPY(CommunicationManager)
};

#endif // COMMUNICATIONMANAGER_H